home *** CD-ROM | disk | FTP | other *** search
/ ASP Advantage 1993 / The Association of Shareware Professionals Advantage CD-ROM 1993.iso / files / utilties / quickext / extra.doc next >
Text File  |  1992-07-01  |  5KB  |  60 lines

  1.  
  2.  
  3. Adressering door de 8086, 8088, 80186 en 80188
  4.  
  5. Een adres van deze microprocessoren is vijf (hexadecimale) cijfers lang.  Ze kunnen dus adresseren van 0 tot 100000.
  6. Aan elke adressering komen twee waarden te pas, namelijk een segment en een offset. Beide zijn vier cijfers lang.  De segmentwaarde is opgeslagen in een segmentregister.
  7. Elke keer als het geheugen geadresseerd moet worden wordt de volgende procedure gevolgd.
  8. De segmentwaarde wordt met 10 vermenigvuldigd en de offset wordt er bij opgeteld.  Is de som 100000 of groter, dan wordt het linker cijfer weggegooid (dit heet wrap-around).  Het resultaat is het gebruikte adres.
  9.  
  10. Adressering door de 80286 in protected mode
  11.  
  12. Een adres van de 80286 is zes cijfers lang.  De methode uit het vorige hoofdstuk voldoet hier dus niet. 
  13. Een segmentregister heet hier selector.  Het wijst (via een bepaalde procedure)
  14. naar een tabel in het geheugen, de descriptortabel.  Deze tabel bevat onder andere de segmentwaarden, elk van zes cijfers.
  15. Elke keer als het geheugen geadresseerd moet worden wordt (schijnbaar) de volgende procedure gevolgd.
  16. Via de selector wordt de gewenste segmentwaarde uit het geheugen gehaald.  De offset wordt er bij opgeteld.  Is de som 1000000 of groter, dan wordt het linker cijfer weggegooid.  Het resultaat is het gebruikte adres.
  17. Nu zal vaak meermalen achter elkaar de zelfde selector worden gebruikt, en elke
  18. keer moet weer de zelfde segmentwaarde uit de descriptortabel worden gehaald.  Dat kost te veel tijd.  Daarom heeft de 80286 voor iedere selector een extra register, de descriptor-cache.  Wordt een selector geladen, dan zoekt de 80286 meteen de bijbehorende descriptor op en laadt deze in de cache. De selector wordt verder genegeerd, de inhoud van de cache wordt gebruikt.
  19. De descriptor-cache is een onzichtbaar register.  De programmeur kan de inhoud niet lezen en het is ook niet mogelijk er direct iets in te schrijven, behalve door de selector te laden.
  20. Ik vermoed dat het wijzigen van de descriptortabel in het geheugen geen effect heeft op de cache.  De 80286 werkt in dat geval dus gewoon verder met de waarde die in de cache zit.
  21.  
  22.  
  23. Adressering door de 80286 in real mode
  24.  
  25. In real mode gedraagt de 80286 zich als een 8086.  Althans zo lijkt het, want de ontwerpers wilden geen onnodig verschil in de werking van de microprocessor in real of protected mode.
  26. Wordt een segmentregister in real mode geladen, dan wordt de nieuwe segmentwaarde automatisch met 10 vermenigvuldigd en in de descriptor-cache geladen.  De descriptor-cache bevat nog steeds een waarde van zes cijfers, maar het eerste en het laatste cijfer zijn altijd nul.  Dat is in real mode anders dan in protected mode.
  27. Bij de verdere adressering wordt de descriptor-cache op de zelfde manier gehanteerd als in protected mode.  Er is dan verder geen verschil merkbaar met de 8086.
  28. Er is slechts een klein verschil tussen de 80286 in real mode en de 8086.  De 80286 heeft geen wrap-around.  Dat betekent dat er iets hoger dan 100000 geadresserd kan worden.  Veel levert het echter niet op.  Het meest linkse cijfer van het segment in de descriptor-cache is altijd nul en dus komt men in real mode niet veel verder dan 100000 (voor de kenners: tot 10FFF0).
  29.  
  30. Voorbeeld van adressering op de 8086, 8088, 80186 en 80188
  31.  
  32. instructie: laad 3128 in segmentregister
  33. gevolg: segmentregister bevat 3128
  34. instructie: adresseer 2513
  35. gevolg: adresseer 10 x 3128 + 2513 = 31280 + 2513 = 33793 
  36.  
  37. Voorbeeld van adressering op de 80286 in real mode                      
  38.  
  39. instructie: laad 3128 in segmentregister
  40. gevolg: segmentregister bevat 3128
  41.         descriptor cache bevat 031280
  42. instructie: adresseer 2513
  43. gevolg: adresseer 031280 + 2513 = 033793 
  44.  
  45. Voorbeeld van adressering op de 80286 in protected mode                      
  46.  
  47. instructie: laad 3128 in segmentregister (selector)
  48. gevolg: segmentregister (selector) bevat 3128
  49.         descriptor cache bevat descriptor 3128 uit tabel, bijvoorbeeld 324011
  50. instructie: adresseer 2513
  51. gevolg: adresseer 324011 + 2513 = 326524 
  52.  
  53. De loadall-instructie
  54.  
  55. In real mode bevat de descriptor cache altijd 10 keer zoveel als het segmentregister, waarbij het eerste en laatste cijfer altijd nul zijn.  Vooral dat eerste cijfer beperkt de adresseringscapaciteit van de 80286 in real mode.
  56. De 80286 heeft echter een speciale instructie, waarmee alle registers onafhankelijk van elkaar geladen kunnen worden.  Men kan hiermee segment-registers en descriptor-caches iedere waarde naar keuze geven, en zelfs is het in real mode mogelijk dat het meest linkse cijfer van het segment in de descriptor-cache groter is dan nul. En bij de adresberekening werkt de 80286 met de descriptor-cache, niet met het segment-register.  Zodoende is het mogelijk het hele 80286-geheugen van 1000000 adressen in real mode te adresseren.
  57. Helaas is de Loadall-instructie nogal grofstoffelijk.  Hij maakt altijd gebruik van adres 000800 en hopelijk is dat adres niet in gebruik voor iets anders.  Hij laadt alle registers en dat kost tijd.  Een goed begrip van de instructie en van alle registers is nodig om Loadall met succes te gebruiken.
  58.  
  59.  
  60.